package com.education.user.controller;

import com.education.common.utils.ApiReturnObject;
import com.education.common.utils.DateUtils;
import com.education.common.utils.StringUtils;
import com.education.user.pojo.SysMenu;
import com.education.user.pojo.SysMenuBig;
import com.education.user.pojo.SysRole;
import com.education.user.pojo.SysRoleMenu;
import com.education.user.pojo.SysUserRole;
import com.education.user.service.SRoleMenuServiceImpl;
import com.education.user.service.SysMenuService;
import com.education.user.service.SysRoleService;
import com.education.user.service.SysUserRoleServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 角色 信息操作处理
 *
 * @author d
 * @date 2020-03-24
 */
@RestController
@RequestMapping("/sysRole")
public class SysRoleController {

    @Autowired
    private SysRoleService sysRoleService;
    @Autowired
    private SysMenuService menuService;
    @Autowired
    private SysUserRoleServiceImpl userRoleService;
    @Autowired
    private SRoleMenuServiceImpl roleMenuService;

    /**
     * 新增保存角色
     */
    @PostMapping("/add")
    public ApiReturnObject addSave(@RequestBody SysRole sysRole) {
        SysRole role = new SysRole();
        role.setRoleName(sysRole.getRoleName());
        role.setDelFlag("0");
        List<SysRole> sysRoles = sysRoleService.selectSysRoleList(role);
        if (sysRoles != null && sysRoles.size() > 0) {
            return new ApiReturnObject("201", "该角色已存在，请勿重复添加", "");
        }
        sysRole.setCreateTime(DateUtils.FdateTime());
        sysRole.setDelFlag("0");
        sysRoleService.insertSysRole(sysRole);
        //返回自动生成主键
        Integer roleId = sysRole.getRoleId();
        //接受字符串
        if (sysRole.getSmList() != null && !"".equals(sysRole.getSmList())) {
            //创建中间表对象
            SysRoleMenu sysRoleMenu = new SysRoleMenu();
            //设置角色id
            sysRoleMenu.setRoleId(roleId);
            //菜单 id 集合
            String[] split = sysRole.getSmList().split(",");
            for (String s : split) {
                sysRoleMenu.setMenuId(Integer.parseInt(s));
                menuService.insertSysMenuRole(sysRoleMenu);
            }
        }
        return new ApiReturnObject("200", "添加成功", "");
    }

    /**
     * 查询角色列表
     */
    @PostMapping("/listRole")
    public ApiReturnObject listRole(@RequestBody SysRole sysRole, Integer pageNum, Integer pageSize) {
        if (pageNum != null && pageSize != null) {
            PageHelper.startPage(pageNum, pageSize);
        }
        sysRole.setDelFlag("0");
        List<SysRole> list = sysRoleService.selectSysRoleList(sysRole);
        PageInfo<SysRole> page = new PageInfo<>(list);
        return new ApiReturnObject("200", "查询成功", page);
    }


    //查询角色列表
    //目录
    public List<SysMenuBig> listBj(List<SysMenuBig> cList) {
        for (SysMenuBig dept : cList) {
            //根据第一级的id查询出下级列表
            List<SysMenuBig> jrCatalogs = menuService.selectSysMenuByParentId(dept.getId());
            if (jrCatalogs != null && jrCatalogs.size() > 0) {
                //设置子级集合
                dept.setChildren(listBj(jrCatalogs));
            }
        }
        return cList;
    }

    /**
     * 查询菜单列表
     */
    @GetMapping("/listMenu")
    public ApiReturnObject listMenu(SysMenu menu) {
        List<SysMenuBig> sysMenus = menuService.selectSysMenuByParentId(0);
        //菜单列表
        List<SysMenuBig> sysMenus1 = listBj(sysMenus);
        return new ApiReturnObject("200", "查询成功", sysMenus1);
    }


    @GetMapping("/listOther")
    public ApiReturnObject listOther(String roleId, Integer pageSize, Integer pageNum) {
        //拿到角色id 进行判断
        if ("1".equals(roleId)) {
            //学生   远程调用 给传分页参数   用户list集合  根据中间表查出学生id集合

        } else if ("2".equals(roleId)) {
            //教师   远程调用 给传分页参数   用户list集合  根据中间表查出教师id集合

        }
//        //参数 角色id  角色属性       1
//        if(pageNum != null && pageSize != null){
//            PageHelper.startPage(pageNum,pageSize);
//        }
//        List<SysRole> list = sysRoleService.selectSysRoleList(sysRole);
//        PageInfo<SysRole> page = new PageInfo<>(list);
        return new ApiReturnObject("200", "查询成功", "");
    }

    /**
     * 查询角色列表
     */
    @GetMapping("/list")
    public ApiReturnObject list(SysRole sysRole, Integer pageSize, Integer pageNum) {
        Integer i = 1;
        if (pageNum != null && pageSize != null) {
            PageHelper.startPage(pageNum, pageSize);
            i = ((pageNum - 1) * pageSize) + 1;
        }
        if ("".equals(sysRole.getRoleName())) {
            sysRole.setRoleName(null);
        }
        sysRole.setDelFlag("0");
        List<SysRole> list = sysRoleService.selectSysRoleList(sysRole);
        int x = 0;
        for (int i1 = 0; i1 < list.size(); i1++) {
            SysRole role = list.get(i1);
            role.setSubscript(i);
            i = i + 1;
            if (role.getCreateTime() != null) {
                role.setCreateTime(role.getCreateTime().split(" ")[0]);
            }
            if ("管理员".equals(role.getRoleName())) {
                x = i1;
            }
        }
        if (x != 0) {
            list.remove(x);
        }
        PageInfo<SysRole> page = new PageInfo<>(list);
        return new ApiReturnObject("200", "查询成功", page);
    }


    /**
     * 查询角色详情
     */
    @GetMapping("/selectOne")
    public ApiReturnObject selectOne(String id) {
        if (id == null && "".equals(id)) {
            return new ApiReturnObject("201", "缺少参数", "");
        }

        //根据roleId 查询菜单
        SysRole role = sysRoleService.selectSysRoleById(Integer.parseInt(id));
        if (role == null) {
            return new ApiReturnObject("201", "未查询到当前角色", "");
        }

        //中间表数据
        List<SysRoleMenu> sysRoleMenus = menuService.selectSysMenuByRoleId(Integer.parseInt(id));
        ArrayList<SysMenu> menus = new ArrayList<>();
        for (SysRoleMenu sysRoleMenu : sysRoleMenus) {
            SysMenu menu = menuService.selectSysMenuById(sysRoleMenu.getMenuId());
            if (menu != null) {
                menus.add(menu);
            }
        }
        role.setSms(menus);
        return new ApiReturnObject("200", "查询成功", role);

    }

    /**
     * 修改保存角色
     */
    @PostMapping("/update")
    public ApiReturnObject editSave(@RequestBody SysRole sysRole) {
        if (sysRole.getRoleId() != null) {
            if (sysRole.getSmList() != null && !"".equals(sysRole.getSmList())) {
                //字符串转为 字符串类型的集合
                List<Integer> mList = sysRole.getmList();
                sysRole.setmList(mList);
            }
            sysRole.setUpdateTime(new Date());
            if (StringUtils.isNotBlank(sysRole.getStatus()) && sysRole.getStatus().equals("1")) {
                Integer userNum = sysRoleService.getUserNum(sysRole.getRoleId());
                if (userNum != null || !userNum.equals(0)) {
                    return new ApiReturnObject("201", "角色下有绑定用户，请先解绑！", "");
                }
            }
            //修改角色信息
            sysRoleService.updateSysRole(sysRole);
            if (sysRole.getmList() != null && sysRole.getmList().size() > 0) {
                //里面存放着对象  先删除中间表中的数据   再往中间表中添加数据
                menuService.deleteMenuRole(sysRole.getRoleId());
                //往中间表添加数据    创建中间表对象
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                //设置角色id
                sysRoleMenu.setRoleId(sysRole.getRoleId());
                for (Integer menu : sysRole.getmList()) {
                    sysRoleMenu.setMenuId(menu);
                    menuService.insertSysMenuRole(sysRoleMenu);
                }
            }
            return new ApiReturnObject("200", "修改成功", "");
        }
        return new ApiReturnObject("201", "缺少参数", "");
    }

    /**
     * 删除角色
     */
    @GetMapping("/del")
    public ApiReturnObject remove(Integer roleId) {
        if (roleId != null) {
            //查询中间表中是否有关联数据
            List<SysUserRole> sysUserRoles = userRoleService.selectSysByRoleId(roleId);
            if (sysUserRoles != null && sysUserRoles.size() > 0) {
                return new ApiReturnObject("201", "该角色正在使用，无法删除", "");
            }
            //删除角色之前先删除角色菜单中间表数据
            roleMenuService.deleteSRoleMenuByIds(roleId);
            SysRole sysRole = new SysRole();
            sysRole.setRoleId(roleId);
            sysRole.setDelFlag("2");
            sysRoleService.updateSysRole(sysRole);
            return new ApiReturnObject("200", "删除成功", "");
        }
        return new ApiReturnObject("201", "缺少参数", "");
    }

    /*

     */
/**
 * 修改保存角色
 *//*

    @PostMapping("/update")
    public ApiReturnObject editSave(@RequestBody SysRole sysRole) {
        if (sysRole.getRoleId() == null)
            return new ApiReturnObject("201", "缺少参数", "");

        //修改角色信息
        sysRole.setUpdateTime(new Date());
        sysRoleService.updateSysRole(sysRole);

        if (sysRole.getmList() != null && sysRole.getmList().size() > 0) {
            //里面存放着对象  先删除中间表中的数据   再往中间表中添加数据
            menuService.deleteMenuRole(sysRole.getRoleId());

            SysRoleMenu sysRoleMenu = new SysRoleMenu();
            //设置角色id
            sysRoleMenu.setRoleId(sysRole.getRoleId());
            for (Integer menu : sysRole.getmList()) {
                sysRoleMenu.setMenuId(menu);
                menuService.insertSysMenuRole(sysRoleMenu);
            }
        }

        return new ApiReturnObject("200", "修改成功", "");
    }
*/
    /* *//**
     * 删除角色
     *//*
    @PostMapping("/del")
    public ApiReturnObject remove(@RequestBody SysRole sysRole) {
        if (sysRole.getRoleId() != null)
            return new ApiReturnObject("201", "缺少参数", "");

        //查询中间表中是否有关联数据
        List<SysUserRole> sysUserRoles = userRoleService.selectSysByRoleId(sysRole.getRoleId());
        if (sysUserRoles != null && sysUserRoles.size() > 0) {
            return new ApiReturnObject("201", "该角色正在使用，无法删除", "");
        }
        //删除角色之前先删除角色菜单中间表数据
        roleMenuService.deleteSRoleMenuByIds(sysRole.getRoleId());

        sysRole.setDelFlag("2");
        sysRoleService.updateSysRole(sysRole);

        return new ApiReturnObject("200", "删除成功", "");
    }*/
}